#数值微分的例子（一维）
import numpy as np
import matplotlib.pyplot as plt

#定义函数y=0.01x*x-0.1x
def function_1(x):
    return 0.01*x**2 + 0.1*x

#定义数值微分函数
def numerical_diff(f, x):
    h = 1e-4  #0.0001
    return (f(x+h)-f(x-h)) / (2*h)

#生成以0.1为单位，从0到20的数组x
x = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim(0, 20)
plt.ylim(0,6)

#计算x=5和x=10处的导数，绘制两处导数的切线（使用过点（a,b）的点斜式y=k(x-a)+b）
d5 = numerical_diff(function_1, 5)
print('d5= ' + str(d5))
d10 = numerical_diff(function_1, 10)
print('d10= ' + str(d10))

y5 = d5 * (x - 5) + function_1(5)
y10 = d10 * (x -10) + function_1(10)

xx1 = np.arange(0.0, 5.0, 0.1)
yy1 = xx1 * 0.0 + function_1(5)
xx2 = np.arange(0.0, 10.0, 0.1)
yy2 = xx2 * 0.0 + function_1(10)

yy3 = np.arange(0.0, function_1(5)+0.1, 0.1)
xx3 = yy3 * 0.0 + 5.0
yy4 = np.arange(0.0, function_1(10)+0.1, 0.1)
xx4 = yy4 * 0.0 + 10.0

plt.plot(x, y)
plt.plot(x, y5)
plt.plot(x, y10)
plt.plot(xx1, yy1)
plt.plot(xx2, yy2)
plt.plot(xx3, yy3)
plt.plot(xx4, yy4)
plt.show()
